parameters:
  - name: VSCODE_QUALITY
    type: string
  - name: VSCODE_RUN_INTEGRATION_TESTS
    type: boolean
  - name: VSCODE_ARCH
    type: string

steps:
  - task: NodeTool@0
    inputs:
      versionSource: fromFile
      versionFilePath: .nvmrc
      nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download

  - template: ../distro/download-distro.yml

  - task: AzureKeyVault@1
    displayName: "Azure Key Vault: Get Secrets"
    inputs:
      azureSubscription: "vscode-builds-subscription"
      KeyVaultName: vscode-build-secrets
      SecretsFilter: "github-distro-mixin-password"

  - task: DownloadPipelineArtifact@2
    inputs:
      artifact: Compilation
      path: $(Build.ArtifactStagingDirectory)
    displayName: Download compilation output

  - script: tar -xzf $(Build.ArtifactStagingDirectory)/compilation.tar.gz
    displayName: Extract compilation output

  - script: |
      set -e
      # Start X server
      sudo apt-get update
      sudo apt-get install -y pkg-config \
        dbus \
        xvfb \
        libgtk-3-0 \
        libxkbfile-dev \
        libkrb5-dev \
        libgbm1 \
        rpm
      sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
      sudo chmod +x /etc/init.d/xvfb
      sudo update-rc.d xvfb defaults
      sudo service xvfb start
      # Start dbus session
      sudo mkdir -p /var/run/dbus
      DBUS_LAUNCH_RESULT=$(sudo dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address)
      echo "##vso[task.setvariable variable=DBUS_SESSION_BUS_ADDRESS]$DBUS_LAUNCH_RESULT"
    displayName: Setup system services

  - script: node build/setup-npm-registry.js $NPM_REGISTRY
    condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
    displayName: Setup NPM Registry

  - script: |
      set -e
      npm config set registry "$NPM_REGISTRY" --location=project
      # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
      # following is a workaround for yarn to send authorization header
      # for GET requests to the registry.
      echo "always-auth=true" >> .npmrc
      yarn config set registry "$NPM_REGISTRY"
    condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
    displayName: Setup NPM & Yarn

  - task: npmAuthenticate@0
    inputs:
      workingFile: .npmrc
    condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
    displayName: Setup NPM Authentication

  - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
    - task: Docker@1
      displayName: "Pull Docker image"
      inputs:
        azureSubscriptionEndpoint: "vscode-builds-subscription"
        azureContainerRegistry: vscodehub.azurecr.io
        command: "Run an image"
        imageName: vscode-linux-build-agent:centos7-devtoolset8-$(VSCODE_ARCH)
        containerCommand: uname

  - ${{ if eq(parameters.VSCODE_ARCH, 'armhf') }}:
    - task: Docker@1
      displayName: "Pull Docker image"
      inputs:
        azureSubscriptionEndpoint: "vscode-builds-subscription"
        azureContainerRegistry: vscodehub.azurecr.io
        command: "Run an image"
        imageName: vscode-linux-build-agent:bionic-arm32v7
        containerCommand: uname

  - script: |
      set -e
      # To workaround the issue of yarn not respecting the registry value from .npmrc
      yarn config set registry "$NPM_REGISTRY"

      for i in {1..5}; do # try 5 times
        yarn --cwd build --frozen-lockfile --check-files && break
        if [ $i -eq 3 ]; then
          echo "Yarn failed too many times" >&2
          exit 1
        fi
        echo "Yarn failed $i, trying again..."
      done

      export VSCODE_SYSROOT_PREFIX='-glibc-2.17'
      source ./build/azure-pipelines/linux/setup-env.sh --only-remote

      for i in {1..5}; do # try 5 times
        yarn --frozen-lockfile --check-files && break
        if [ $i -eq 3 ]; then
          echo "Yarn failed too many times" >&2
          exit 1
        fi
        echo "Yarn failed $i, trying again..."
      done
    env:
      npm_config_arch: $(NPM_ARCH)
      VSCODE_ARCH: $(VSCODE_ARCH)
      NPM_REGISTRY: "$(NPM_REGISTRY)"
      ELECTRON_SKIP_BINARY_DOWNLOAD: 1
      PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
      GITHUB_TOKEN: "$(github-distro-mixin-password)"
      VSCODE_HOST_MOUNT: "/mnt/vss/_work/1/s"
      ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
        VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:centos7-devtoolset8-$(VSCODE_ARCH)
      ${{ if eq(parameters.VSCODE_ARCH, 'armhf') }}:
        VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:bionic-arm32v7
    displayName: Install dependencies

  - script: node build/azure-pipelines/distro/mixin-npm
    displayName: Mixin distro node modules

  - script: node build/azure-pipelines/distro/mixin-quality
    displayName: Mixin distro quality

  - template: ../common/install-builtin-extensions.yml

  - script: |
      set -e
      yarn gulp vscode-linux-$(VSCODE_ARCH)-min-ci
      ARCHIVE_PATH=".build/linux/client/code-${{ parameters.VSCODE_QUALITY }}-$(VSCODE_ARCH)-$(date +%s).tar.gz"
      mkdir -p $(dirname $ARCHIVE_PATH)
      echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"
    env:
      GITHUB_TOKEN: "$(github-distro-mixin-password)"
    displayName: Build client

  - script: |
      set -e
      tar -czf $CLIENT_PATH -C .. VSCode-linux-$(VSCODE_ARCH)
    env:
      GITHUB_TOKEN: "$(github-distro-mixin-password)"
    displayName: Archive client

  - script: |
      set -e
      export VSCODE_NODE_GLIBC="-glibc-2.17"
      yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
      mv ../vscode-reh-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH) # TODO@joaomoreno
      ARCHIVE_PATH=".build/linux/server/vscode-server-linux-legacy-$(VSCODE_ARCH).tar.gz"
      UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)"
      mkdir -p $(dirname $ARCHIVE_PATH)
      tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)
      echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
      echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH"
    env:
      GITHUB_TOKEN: "$(github-distro-mixin-password)"
    displayName: Build server

  - script: |
      set -e
      export VSCODE_NODE_GLIBC="-glibc-2.17"
      yarn gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
      mv ../vscode-reh-web-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH)-web # TODO@joaomoreno
      ARCHIVE_PATH=".build/linux/web/vscode-server-linux-legacy-$(VSCODE_ARCH)-web.tar.gz"
      mkdir -p $(dirname $ARCHIVE_PATH)
      tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)-web
      echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
    env:
      GITHUB_TOKEN: "$(github-distro-mixin-password)"
    displayName: Build server (web)

  - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
    - script: |
        set -e
        EXPECTED_GLIBC_VERSION="2.17" \
        EXPECTED_GLIBCXX_VERSION="3.4.19" \
        ./build/azure-pipelines/linux/verify-glibc-requirements.sh
      env:
        SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
      displayName: Check GLIBC and GLIBCXX dependencies in server archive

  - ${{ else }}:
    - script: |
        set -e
        EXPECTED_GLIBC_VERSION="2.28" \
        EXPECTED_GLIBCXX_VERSION="3.4.22" \
        ./build/azure-pipelines/linux/verify-glibc-requirements.sh
      env:
        SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
      displayName: Check GLIBC and GLIBCXX dependencies in server archive

  - ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}:
    - template: product-build-linux-test.yml
      parameters:
        VSCODE_QUALITY: ${{ parameters.VSCODE_QUALITY }}
        VSCODE_RUN_UNIT_TESTS: false
        VSCODE_RUN_INTEGRATION_TESTS: ${{ parameters.VSCODE_RUN_INTEGRATION_TESTS }}
        VSCODE_RUN_SMOKE_TESTS: false
        ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
          PUBLISH_TASK_NAME: 1ES.PublishPipelineArtifact@1

  - task: 1ES.PublishPipelineArtifact@1
    inputs:
      targetPath: $(SERVER_PATH)
      artifactName: $(ARTIFACT_PREFIX)vscode_server_linux_legacy_$(VSCODE_ARCH)_archive-unsigned
      sbomBuildDropPath: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH)
      sbomPackageName: "VS Code Linux $(VSCODE_ARCH) Legacy Server"
      sbomPackageVersion: $(Build.SourceVersion)
    condition: and(succeededOrFailed(), ne(variables['SERVER_PATH'], ''))
    displayName: Publish server archive

  - task: 1ES.PublishPipelineArtifact@1
    inputs:
      targetPath: $(WEB_PATH)
      artifactName: $(ARTIFACT_PREFIX)vscode_web_linux_legacy_$(VSCODE_ARCH)_archive-unsigned
      sbomBuildDropPath: $(Agent.BuildDirectory)/vscode-server-linux-$(VSCODE_ARCH)-web
      sbomPackageName: "VS Code Linux $(VSCODE_ARCH) Legacy Web"
      sbomPackageVersion: $(Build.SourceVersion)
    condition: and(succeededOrFailed(), ne(variables['WEB_PATH'], ''))
    displayName: Publish web server archive
